#!/usr/bin/env bash
# rocky-k8s-install.sh

set -euo pipefail  # 脚本出错时立即退出，避免执行后续错误操作

# 脚本说明
echo "===== 开始在Rocky Linux上部署Kubernetes集群（所有节点执行） ====="


# 1. 关闭并禁用防火墙（K8s需要特定端口通信，简化防火墙规则）
echo -e "\n===== 步骤1/13：关闭并禁用firewalld防火墙 ====="
systemctl disable --now firewalld
echo "firewalld已禁用并停止"


# 2. 关闭并禁用dnsmasq（避免与K8s网络组件冲突）
echo -e "\n===== 步骤2/13：关闭并禁用dnsmasq ====="
# systemctl disable --now dnsmasq
# echo "dnsmasq已禁用并停止"
echo "dnsmasq未安装"

# 3. 关闭SELinux（临时+永久，避免权限限制影响容器运行）
echo -e "\n===== 步骤3/13：关闭SELinux ====="
setenforce 0  # 临时关闭
# 永久关闭（修改配置文件）
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
echo "SELinux已临时关闭，且已配置永久禁用"


# 4. 关闭Swap分区（K8s要求禁用Swap以保证性能）
echo -e "\n===== 步骤4/13：关闭Swap分区 ====="
swapoff -a  # 临时关闭
sysctl -w vm.swappiness=0  # 禁用Swap策略
# 永久关闭（注释fstab中的Swap配置）
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
# 关闭swap.target
systemctl stop swap.target
systemctl mask swap.target
echo "Swap已临时关闭，且已配置永久禁用"


# 5. 配置Rocky Linux阿里镜像源（加速软件包下载）
echo -e "\n===== 步骤5/13：配置Rocky Linux阿里镜像源 ====="
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/*.repo
echo "Rocky Linux镜像源已替换为阿里源"


# 6. 更新yum缓存（使新镜像源生效）
echo -e "\n===== 步骤6/13：更新yum缓存 ====="
dnf makecache
echo "yum缓存更新完成"


# 7. 安装必备系统工具（基础依赖和运维工具）
echo -e "\n===== 步骤7/13：安装必备系统工具 ====="
dnf install -y wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git
echo "必备工具安装完成"


# 8. 配置Docker CE源并安装containerd（K8s推荐的容器运行时）
echo -e "\n===== 步骤8/13：安装containerd容器运行时 ====="
# 添加Docker CE阿里源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装containerd
dnf install -y containerd.io
echo "containerd安装完成"


# 9. 配置容器所需内核模块（overlay和br_netfilter是容器网络必备）
echo -e "\n===== 步骤9/13：配置容器内核模块 ====="
# 写入模块配置文件（永久生效）
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 立即加载模块（临时生效）
modprobe overlay
modprobe br_netfilter
echo "容器所需内核模块已配置并加载"


# 10. 配置K8s网络相关sysctl参数（开启桥接网络和IP转发）
echo -e "\n===== 步骤10/13：配置Kubernetes网络参数 ====="
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 生效配置
sysctl --system
echo "K8s网络参数已配置并生效"


# 11. 配置containerd（设置SystemdCgroup和国内镜像源）
echo -e "\n===== 步骤11/13：配置containerd ====="
# 生成默认配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

# 关键配置修改：
# 1. 启用SystemdCgroup（与systemd兼容，避免容器进程管理冲突）
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 2. 替换pause镜像为阿里源（解决国外镜像拉取失败问题）
sed -i 's#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
sed -i 's#registry.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
sed -i 's#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml

# 验证配置
echo -e "\n验证containerd关键配置："
grep -i "SystemdCgroup" /etc/containerd/config.toml
grep "registry.cn-hangzhou.aliyuncs.com/google_containers/pause" /etc/containerd/config.toml

# 重启containerd使配置生效
systemctl daemon-reload
systemctl enable --now containerd
echo "containerd配置完成并重启生效"


# 12. 安装Kubernetes组件（kubeadm/kubelet/kubectl）
echo -e "\n===== 步骤12/13：安装Kubernetes组件 ====="
# 配置K8s阿里源（v1.33版本）
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/repodata/repomd.xml.key
EOF

# 安装指定版本组件
dnf install -y kubeadm-1.33.5* kubelet-1.33.5* kubectl-1.33.5*

# 验证版本
echo -e "\n已安装的Kubernetes组件版本："
kubelet --version
kubeadm version
kubectl version --client

# 设置kubelet开机自启
systemctl enable --now kubelet
echo "Kubernetes组件安装完成，kubelet已设置开机自启"


# 13. 拉取K8s所需容器镜像（从阿里源拉取，避免网络问题）
echo -e "\n===== 步骤13/13：拉取Kubernetes容器镜像 ====="
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version 1.33.5 --v=5
echo "所有Kubernetes镜像拉取完成"


echo -e "\n===== 所有节点基础环境配置完成！接下来：====="
echo "1. 在控制平面节点执行 'kubeadm init ......' 初始化集群"
echo "2. 在工作节点执行控制平面输出的 'kubeadm join ......' 命令加入集群"